Gray code

Time: O(2^N); Space: O(1); medium

The gray code is a binary numeral system where two successive values differ in only one bit.

Given a non-negative integer n representing the total number of bits in the code, print the sequence of gray code. A gray code sequence must begin with 0.

Example 1:

Input: n = 2

Output: [0,1,3,2]

Explanation:

  • 00 - 0

  • 01 - 1

  • 11 - 3

  • 10 - 2

  • For a given n, a gray code sequence may not be uniquely defined.

  • For example, [0,2,3,1] is also a valid gray code sequence.

  • 00 - 0

  • 10 - 2

  • 11 - 3

  • 01 - 1

Example 2:

Input: n = 0

Output: [0]

Explanation:

  • We define the gray code sequence to begin with 0.

  • A gray code sequence of n has size = 2^n, which for n = 0 the size is 2^0 = 1.

  • Therefore, for n = 0 the gray code sequence is [0].

Notes:

  • For a given n, a gray code sequence is not uniquely defined.

  • For example, [0,2,3,1] is also a valid gray code sequence according to the above definition.

[1]:
class Solution1(object):
    def grayCode(self, n):
        """
        :type n: int
        :rtype: List[int]
        """
        result = [0]
        for i in range(n):
            for n in reversed(result):
                result.append(1 << i | n)
        return result
[2]:
s = Solution1()
n = 0
assert s.grayCode(n) == [0]
n = 2
assert s.grayCode(n) == [0, 1, 3, 2]

Proof of closed form formula could be found here

[5]:
class Solution2(object):
    def grayCode(self, n):
        """
        :type n: int
        :rtype: List[int]
        """
        return [i >> 1 ^ i for i in range(1 << n)]
[6]:
s = Solution2()
n = 0
assert s.grayCode(n) == [0]
n = 2
assert s.grayCode(n) == [0, 1, 3, 2]